﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Xml;
//using System.Xml.XPath;
//using System.Diagnostics;

//namespace GenericLibrary.Xml.XPath {

//    //public interface IXPathNode2 {

//    //    XPathNodeType NodeType { get; }
//    //    string Prefix { get; }
//    //    string LocalName { get; }
//    //    string Value { get; }
//    //}

//    //public interface IXPathNodeTree {

//    //    XmlNameTable NameTable { get; }
//    //    IXPathNode2 GetRoot();
//    //    IXPathNode2 GetById( string id );
//    //    IXPathNode2 GetParent( IXPathNode2 contextNode );
//    //    IXPathNode2 GetFirstChild( IXPathNode2 contextNode );
//    //    IXPathNode2 GetPrevious( IXPathNode2 contextNode );
//    //    IXPathNode2 GetNext( IXPathNode2 contextNode );
//    //    IXPathNode2 GetFirstAttribute( IXPathNode2 contextNode );
//    //    IXPathNode2 GetNextAttribute( IXPathNode2 contextNode );
//    //    IXPathNode2 GetFirstNamespace( IXPathNode2 contextNode );
//    //    IXPathNode2 GetNextNamespace( IXPathNode2 contextNode );
//    //    void CreateAttribute( IXPathNode2 contextNode, string prefix, string localName, string namespaceUri, string value );
//    //    void AppendChild( IXPathNode2 contextNode, string prefix, string localName, string namespaceUri, string value );
//    //    void InsertSibling( IXPathNode2 contextNode, string prefix, string localName, string namespaceUri, string value );
//    //}



//    //public class XPathNodeTree : IXPathNavigable {

//    //    private IXPathNodeTree _tree;

//    //    public XPathNodeTree( IXPathNodeTree tree ) {
//    //        this._tree = tree;
//    //    }

//    //    #region IXPathNavigable Members

//    //    XPathNavigator IXPathNavigable.CreateNavigator() {
//    //        try {
//    //            return new XPathNodeTreeNavigator( this._tree, this._tree.GetRoot() );
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    #endregion
//    //}

//    //public abstract class XPathNodeTree : IXPathNavigable {

//    //    protected internal abstract XmlNameTable NameTable { get; }
//    //    protected internal abstract IXPathNode GetRoot();
//    //    protected internal abstract IXPathNode GetById( string id );
//    //    protected internal abstract IXPathNode GetParent( IXPathNode contextNode );
//    //    protected internal abstract IXPathNode GetFirstChild( IXPathNode contextNode );
//    //    protected internal abstract IXPathNode GetPrevious( IXPathNode contextNode );
//    //    protected internal abstract IXPathNode GetNext( IXPathNode contextNode );
//    //    protected internal abstract IXPathNode GetFirstAttribute( IXPathNode contextNode );
//    //    protected internal abstract IXPathNode GetNextAttribute( IXPathNode contextNode );
//    //    protected internal abstract IXPathNode GetFirstNamespace( IXPathNode contextNode );
//    //    protected internal abstract IXPathNode GetNextNamespace( IXPathNode contextNode );

//    //    protected internal virtual void CreateAttribute( IXPathNode contextNode, string prefix, string localName, string namespaceUri, string value ) {
//    //        throw new NotImplementedException();
//    //    }

//    //    protected internal virtual void AppendChild( IXPathNode contextNode, string prefix, string localName, string namespaceUri, string value ) {
//    //        throw new NotImplementedException();
//    //    }

//    //    protected internal virtual void InsertSibling( IXPathNode contextNode, string prefix, string localName, string namespaceUri, string value ) {
//    //        throw new NotImplementedException();
//    //    }

//    //    #region IXPathNavigable Members

//    //    public XPathNavigator CreateNavigator() {
//    //        return new XPathNodeTreeNavigator( this, this.GetRoot() );
//    //    }

//    //    #endregion
//    //}

//    //public class XPathNodeTreeNavigator : XPathNavigator {

//    //    private IXPathNodeTree _tree;
//    //    private IXPathNode2 _node;

//    //    public override string BaseURI {
//    //        get { throw new NotImplementedException(); }
//    //    }

//    //    public override XPathNavigator Clone() {
//    //        return new XPathNodeTreeNavigator( this._tree, this._node );
//    //    }

//    //    public override bool IsEmptyElement {
//    //        get { throw new NotImplementedException(); }
//    //    }

//    //    public override bool IsSamePosition( XPathNavigator other ) {
//    //        throw new NotImplementedException();
//    //    }

//    //    public override string LocalName {
//    //        get {
//    //            try {
//    //                switch( this._node.NodeType ) {
//    //                    case XPathNodeType.Attribute:
//    //                    case XPathNodeType.Element:
//    //                    case XPathNodeType.Namespace:
//    //                        return this._node.LocalName;
//    //                    default:
//    //                        return string.Empty;
//    //                }
//    //            } catch( Exception ) {
//    //                Debug.Assert( false );
//    //                throw;
//    //            }
//    //        }
//    //    }

//    //    public override bool MoveTo( XPathNavigator other ) {
//    //        try {
//    //            XPathNodeTreeNavigator _other = other as XPathNodeTreeNavigator;
//    //            if( _other != null && _other._tree == this._tree ) {
//    //                this._node = _other._node;
//    //                return true;
//    //            }
//    //            return false;
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToFirstAttribute() {
//    //        try {
//    //            switch( this._node.NodeType ) {
//    //                case XPathNodeType.Element:
//    //                    IXPathNode2 node = this._tree.GetFirstAttribute( this._node );
//    //                    if( node == null ) {
//    //                        return false;
//    //                    }
//    //                    if( node.NodeType != XPathNodeType.Attribute ) {
//    //                        throw new Exception();
//    //                    }
//    //                    this._node = node;
//    //                    return true;
//    //                default:
//    //                    return false;
//    //            }
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToFirstChild() {
//    //        try {
//    //            switch( this._node.NodeType ) {
//    //                case XPathNodeType.Element:
//    //                case XPathNodeType.Root:
//    //                    IXPathNode2 node = this._tree.GetFirstChild( this._node );
//    //                    if( node == null ) {
//    //                        return false;
//    //                    }
//    //                    if( node.NodeType != XPathNodeType.Element && node.NodeType != XPathNodeType.Text ) {
//    //                        throw new Exception();
//    //                    }
//    //                    this._node = node;
//    //                    return true;
//    //                default:
//    //                    return false;
//    //            }
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToFirstNamespace( XPathNamespaceScope namespaceScope ) {
//    //        try {
//    //            switch( this._node.NodeType ) {
//    //                case XPathNodeType.Element:
//    //                    IXPathNode2 node = this._tree.GetFirstNamespace( this._node );
//    //                    if( node == null ) {
//    //                        return false;
//    //                    }
//    //                    if( node.NodeType != XPathNodeType.Namespace ) {
//    //                        throw new Exception();
//    //                    }
//    //                    this._node = node;
//    //                    return true;
//    //                default:
//    //                    return false;
//    //            }
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToId( string id ) {
//    //        try {
//    //            IXPathNode2 node = this._tree.GetById( id );
//    //            if( node == null ) {
//    //                return false;
//    //            }
//    //            if( node.NodeType != XPathNodeType.Element ) {
//    //                throw new Exception();
//    //            }
//    //            this._node = node;
//    //            return true;
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToNext() {
//    //        try {
//    //            switch( this._node.NodeType ) {
//    //                case XPathNodeType.Element:
//    //                case XPathNodeType.Text:
//    //                    IXPathNode2 node = this._tree.GetNext( this._node );
//    //                    if( node == null ) {
//    //                        return false;
//    //                    }
//    //                    if( node.NodeType != XPathNodeType.Element && node.NodeType != XPathNodeType.Text ) {
//    //                        throw new Exception();
//    //                    }
//    //                    this._node = node;
//    //                    return true;
//    //                default:
//    //                    return false;
//    //            }
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToNextAttribute() {
//    //        try {
//    //            switch( this._node.NodeType ) {
//    //                case XPathNodeType.Attribute:
//    //                    IXPathNode2 node = this._tree.GetNextAttribute( this._node );
//    //                    if( node == null ) {
//    //                        return false;
//    //                    }
//    //                    if( node.NodeType != XPathNodeType.Attribute ) {
//    //                        throw new Exception();
//    //                    }
//    //                    this._node = node;
//    //                    return true;
//    //                default:
//    //                    return false;
//    //            }
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToNextNamespace( XPathNamespaceScope namespaceScope ) {
//    //        try {
//    //            switch( this._node.NodeType ) {
//    //                case XPathNodeType.Namespace:
//    //                    IXPathNode2 node = this._tree.GetNextNamespace( this._node );
//    //                    if( node == null ) {
//    //                        return false;
//    //                    }
//    //                    if( node.NodeType != XPathNodeType.Namespace ) {
//    //                        throw new Exception();
//    //                    }
//    //                    this._node = node;
//    //                    return true;
//    //                default:
//    //                    return false;
//    //            }
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToParent() {
//    //        try {
//    //            IXPathNode2 node;
//    //            switch( this._node.NodeType ) {
//    //                case XPathNodeType.Element:
//    //                case XPathNodeType.Text:
//    //                    node = this._tree.GetParent( this._node );
//    //                    if( node != null && ( node.NodeType == XPathNodeType.Element || node.NodeType == XPathNodeType.Root ) ) {
//    //                        this._node = node;
//    //                        return true;
//    //                    }
//    //                    throw new Exception();
//    //                case XPathNodeType.Attribute:
//    //                    node = this._tree.GetParent( this._node );
//    //                    if( node != null && node.NodeType == XPathNodeType.Element ) {
//    //                        this._node = node;
//    //                        return true;
//    //                    }
//    //                    throw new Exception();
//    //                case XPathNodeType.Namespace:
//    //                    node = this._tree.GetParent( this._node );
//    //                    if( node != null && node.NodeType == XPathNodeType.Element ) {
//    //                        this._node = node;
//    //                        return true;
//    //                    }
//    //                    throw new Exception();
//    //                default:
//    //                    return false;
//    //            }
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override bool MoveToPrevious() {
//    //        try {
//    //            switch( this._node.NodeType ) {
//    //                case XPathNodeType.Element:
//    //                case XPathNodeType.Text:
//    //                    IXPathNode2 node = this._tree.GetPrevious( this._node );
//    //                    if( node == null ) {
//    //                        return false;
//    //                    }
//    //                    if( node.NodeType != XPathNodeType.Element && node.NodeType != XPathNodeType.Text ) {
//    //                        throw new Exception();
//    //                    }
//    //                    this._node = node;
//    //                    return true;
//    //                default:
//    //                    return false;
//    //            }
//    //        } catch( Exception ) {
//    //            Debug.Assert( false );
//    //            throw;
//    //        }
//    //    }

//    //    public override string Name {
//    //        get {
//    //            try {
//    //                switch( this._node.NodeType ) {
//    //                    case XPathNodeType.Element:
//    //                    case XPathNodeType.Attribute:
//    //                        return this._node.Prefix + ":" + this._node.LocalName;
//    //                    case XPathNodeType.Namespace:
//    //                        return this._node.LocalName;
//    //                    default:
//    //                        return string.Empty;
//    //                }
//    //            } catch( Exception ) {
//    //                Debug.Assert( false );
//    //                throw;
//    //            }
//    //        }
//    //    }

//    //    public override XmlNameTable NameTable {
//    //        get {
//    //            try {
//    //                return this._tree.NameTable;
//    //            } catch( Exception ) {
//    //                Debug.Assert( false );
//    //                throw;
//    //            }
//    //        }
//    //    }

//    //    public override string NamespaceURI {
//    //        get {
//    //            try {
//    //                switch( this._node.NodeType ) {
//    //                    case XPathNodeType.Element:
//    //                    case XPathNodeType.Attribute:
//    //                        XPathNavigator clone = this.Clone();
//    //                        if( clone.MoveToFirstNamespace() ) {
//    //                            do {
//    //                                string s = clone.LocalName;
//    //                                if( s == this.Prefix ) {
//    //                                    return clone.Value;
//    //                                }
//    //                            } while( clone.MoveToNextNamespace() );
//    //                        }
//    //                        throw new Exception();
//    //                    default:
//    //                        return string.Empty;
//    //                }
//    //            } catch( Exception ) {
//    //                Debug.Assert( false );
//    //                throw;
//    //            }
//    //        }
//    //    }

//    //    public override XPathNodeType NodeType {
//    //        get {
//    //            try {
//    //                return this._node.NodeType;
//    //            } catch( Exception ) {
//    //                Debug.Assert( false );
//    //                throw;
//    //            }
//    //        }
//    //    }

//    //    public override string Prefix {
//    //        get {
//    //            try {
//    //                switch( this._node.NodeType ) {
//    //                    case XPathNodeType.Element:
//    //                    case XPathNodeType.Attribute:
//    //                        return this._node.Prefix;
//    //                    default:
//    //                        return string.Empty;
//    //                }
//    //            } catch( Exception ) {
//    //                Debug.Assert( false );
//    //                throw;
//    //            }
//    //        }
//    //    }

//    //    public override string Value {
//    //        get {
//    //            try {
//    //                switch( this._node.NodeType ) {
//    //                    case XPathNodeType.Attribute:
//    //                    case XPathNodeType.Text:
//    //                    case XPathNodeType.Namespace:
//    //                        return this._node.Value;
//    //                    case XPathNodeType.Element:
//    //                    case XPathNodeType.Root:
//    //                        string s = "";
//    //                        XPathNavigator clone = this.Clone();
//    //                        if( clone.MoveToFirstChild() ) {
//    //                            do {
//    //                                s += clone.Value;
//    //                            } while( clone.MoveToNext() );
//    //                        }
//    //                        return s;
//    //                    default:
//    //                        return string.Empty;
//    //                }
//    //            } catch( Exception ) {
//    //                Debug.Assert( false );
//    //                throw;
//    //            }
//    //        }
//    //    }

//    //    public override void CreateAttribute( string prefix, string localName, string namespaceURI, string value ) {
//    //        base.CreateAttribute( prefix, localName, namespaceURI, value );
//    //    }

//    //    internal XPathNodeTreeNavigator( IXPathNodeTree tree, IXPathNode2 node ) {
//    //        this._tree = tree;
//    //        this._node = node;
//    //    }
//    //}

//    public interface IXPathNode {

//        XmlNameTable NameTable { get; }
//        XPathNodeType NodeType { get; }
//        string BaseUri { get; }
//        string Prefix { get; }
//        string NamespaceUri { get; }
//        string LocalName { get; }
//        string Value { get; }
//        bool IsEmptyElement { get; }
//        IXPathNode GetParent();
//        IXPathNode GetFirstChild();
//        IXPathNode GetPreviousSibling();
//        IXPathNode GetNextSibling();
//        IXPathNode GetFirstAttribute();
//        IXPathNode GetNextAttribute();
//        IXPathNode GetFirstNamespace( XPathNamespaceScope namespaceScope );
//        IXPathNode GetNextNamespace( XPathNamespaceScope namespaceScope );
//        IXPathNode GetElementById( string id );
//        bool IsSamePosition( IXPathNode other );

//        bool CanEdit { get; }
//        void CreateAttribute( string prefix, string localName, string namespaceUri, string value );
//        void AppendChildElement( string prefix, string localName, string namespaceUri, string value );
//        void AppendChild( XPathNavigator newChild );
//        void AppendChild( XmlReader newChild );
//        void AppendChild( string newChild );
//        void PrependChildElement( string prefix, string localName, string namespaceUri, string value );
//        void PrependChild( XPathNavigator newChild );
//        void PrependChild( XmlReader newChild );
//        void PrependChild( string newChild );
//        void InsertElementAfter( string prefix, string localName, string namespaceUri, string value );
//        void InsertAfter( XPathNavigator newSibling );
//        void InsertAfter( XmlReader newSibling );
//        void InsertAfter( string newSibling );
//        void InsertElementBefore( string prefix, string localName, string namespaceUri, string value );
//        void InsertBefore( XPathNavigator newSibling );
//        void InsertBefore( XmlReader newSibling );
//        void InsertBefore( string newSibling );
//        void DeleteSelf();
//        void SetValue( string value );

//        IXPathNode Clone();
//    }

    



//}
